package com.class06.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;

//  java配置类取代xml配置文件:
//1. 配置类  加@Configuration
@Configuration  //相当于  spring-01.xml
//2. 配置类 加@ComponentScan
//  @ComponentScan 相当于 <context:component-scan base-package="com.class06.ioc_01"/>
@ComponentScan("com.class06.ioc_01") //扫描单个包
//@ComponentScan(basePackages =
// {"com.class06.ioc_01","com.class06.ioc_02"}) 扫描多个包
//3. 配置类 加@PropertySource
//@PropertySource("classpath:jdbc.properties")
// 相当于<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")
public class JavaConfiguration {

    @Value("${class06.url}")
    private String url;
    @Value("${class06.driver}")
    private String driver;
    @Value("${class06.user}")
    private String username;
    @Value("${class06.pwd}")
    private String password;


    //    4、由于无法到第三方jar包中添加@Component注解，所以无法使用@Autowired注解注入第三方jar包中的类
//    就需要自己创建方法，实例化化组件，然后再注入到容器中   @Bean
//    @Bean  默认id为方法名，可以自己指定id  @Bean(name="") / @Bean(value="")


//    5、指定周期方法
//    原有：<init-method/destroy-method >  =>   @PostConstruct / @PreDestroy
//    => @Bean(initMethod="",destroyMethod="")
//    @Bean  //相当于<bean id="" class=""/>
//    在@Bean中使用initMethod 和 destroyMethod属性 需要注意：方法返回是周期方法类型，
//    而周期方法中定义 需要满足的条件是：public void 方法名可以随意起


//    @Bean


    public DataSource getDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }


    @Bean(initMethod = "init")
    public BeanTest beanOne() {
        return new BeanTest();
    }




}
